<?php
/**
 * Yotaku Shop - yshop
 * @author Creatint<creatint@163.com>
 * @copyright www.yotaku.cn 2016
 */

/**
 * Yshop 常量设置
 */
const YSHOP_ADDON_PATH = '../Addons/';

/**
 * 字符串截取，支持中文和其他编码
 * @static
 * @access public
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * @return string
 */
function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
{
    if (function_exists("mb_substr")) {
        $slice = mb_substr($str, $start, $length, $charset);
    } elseif (function_exists('iconv_substr')) {
        $slice = iconv_substr($str, $start, $length, $charset);
    } else {
        $re['utf-8']  = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("", array_slice($match[0], $start, $length));
    }
    return $suffix ? $slice . '...' : $slice;
}
/**
 * 产生随机字串，可用来自动生成密码
 * 默认长度6位 字母和数字混合 支持中文
 * @param string $len 长度
 * @param string $type 字串类型 0 字母 1 数字 其它 混合
 * @param string $addChars 额外字符
 * @return string
 */
function randString($len = 6, $type = '', $addChars = '')
{
    $str = '';
    switch ($type) {
        case 0:
            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' . $addChars;
            break;
        case 1:
            $chars = str_repeat('0123456789', 3);
            break;
        case 2:
            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . $addChars;
            break;
        case 3:
            $chars = 'abcdefghijklmnopqrstuvwxyz' . $addChars;
            break;
        case 4:
            $chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借" . $addChars;
            break;
        default:
            // 默认去掉了容易混淆的字符oOLl和数字01，要添加请使用addChars参数
            $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789' . $addChars;
            break;
    }
    if ($len > 10) {
//位数过长重复字符串一定次数
        $chars = 1 == $type ? str_repeat($chars, $len) : str_repeat($chars, 5);
    }
    if (4 != $type) {
        $chars = str_shuffle($chars);
        $str   = substr($chars, 0, $len);
    } else {
        // 中文随机字
        for ($i = 0; $i < $len; $i++) {
            $str .= msubstr($chars, floor(mt_rand(0, mb_strlen($chars, 'utf-8') - 1)), 1, 'utf-8', false);
        }
    }
    return $str;
}


function get_cover($id, $field = 'path,id'){
    $id = (int)$id>0?(int)$id:0;
    $Picture    =   D("Picture");
    $res = $Picture->getPicturesById($id,$field);
    if(1 == count($res)){
        $res = $res[0];
    }
    if('path' == $field){
        $res = $res['path'];
    }
//    trace($res,'res');
    return $res;
}

/**
 * @describe    获取商品多图或单图
 * @author Creatint
 * @param $multimages
 * @param int $index
 * @param bool $field
 * @return mixed
 */
function get_item_imgs($multimages,$index=0,$field='path'){
    $multimages = trim($multimages,',');
//    trace($multimages,'mutimages');
    if(empty($multimages)){
        return;
    }
    if(is_array($multimages)){
        foreach($multimages as $v){
            $id_arr[]   =   $v;
        }unset($v);
    }elseif(is_numeric($multimages)){
        $id_arr = $multimages;
    }else{
        $id_arr =   explode(',',$multimages);
    }
//    trace($id_arr,'图片ids');
    $Picture    =   D("Picture");


//    trace($ids,'ids');
    $res    =   $Picture->getPicturesById($id_arr,$field);
    if(0 == $index){
    }elseif (0 < $index){
        $res = $res[$index-1];
    }
//    trace($res,'res');

    return $res;
}




/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId =  $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

/**
 * @describe 获取数组深度
 * @author Creatint
 * @param $array
 * @return int
 */
function array_depth($array) {
    $max_depth = 1;
    foreach ($array as $value) {
        if (is_array($value)) {
            $depth = array_depth($value) + 1;


            if ($depth > $max_depth) {
                $max_depth = $depth;
            }
        }
    }
    return $max_depth;
}

/**
 * @describe tree深度获取
 * @author Creatint
 * @param $array
 * @param int $depth
 * @return int
 */
function getDepth(&$array,$depth = 0,$child = 'child',$field = 'depth'){
    $depth ++;
    foreach($array as $key=>&$value){
        $value[$field] = $depth;
        if(isset($value[$child]) && is_array($value[$child])){
            getDepth($value[$child],$depth);
        }else{
            $value[$field] = $depth;
        }
    }

    return $depth;
}


/**
 * @describe  列表转树
 * @author Creatint
 * @param $tree
 * @param string $child
 * @return array
 */
//TODO:有待优化
function tree_to_list($tree,$child = 'child'){
    static $list = array();
    foreach($tree as $v){
        if( !is_array($v[$child])){
            $list[] =   $v;
        }else{
            $tmp = $v[$child];
            unset($v[$child]);
            $list[] =   $v;
            tree_to_list($tmp);
        }
    }
    return $list;
}

/**
 * @describe 获取列表中某ID的所有子级及自身
 * @author Creatint
 * @param $id
 * @param $list
 * @return array|bool
 */
function get_children($id,$list,$field=true){
    if(!is_array($list) || !$id){
        return false;
    }
    $list_children = array();
    if(is_string($field) && (strpos($field,',')>0)){
        $field_array[]=str_split(',',$field);
    } else {
        $field_array[]=$field;
    }

    foreach($list as $k=>$v){
        if($id == $v['id']){
            //self
            if(true === $field){
                $list_children[] = $v;
            }else{
                if(count($field_array) == 1){
                    $list_children[] = $v[$field_array[0]];
                }else{
                    foreach($field_array as $field_v){
                        $arr_tmp[] = $v[$field_v];
                    }
                    $list_children[] = $arr_tmp;
                }
            }
            unset($list[$k]);
        }elseif($id == $v['pid']){
            //child
            $list_children = array_merge($list_children, get_children($v['id'],$list,$field));
        }
    }
    return $list_children;
}

// 分析枚举类型配置值 格式 a:名称1,b:名称2
function parse_config_attr($string) {
    $array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
    if(strpos($string,':')){
        $value  =   array();
        foreach ($array as $val) {
            list($k, $v) = explode(':', $val);
            $value[$k]   = $v;
        }
    }else{
        $value  =   $array;
    }
    return $value;
}


/**
 * 字符串转换为数组，主要用于把分隔符调整到第二个参数
 * @param  string $str  要分割的字符串
 * @param  string $glue 分割符
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function str2arr($str, $glue = ','){
    return explode($glue, $str);
}


/**
 * 检查$pos(推荐位的值)是否包含指定推荐位$contain
 * @param number $pos 推荐位的值
 * @param number $contain 指定推荐位
 * @return boolean true 包含 ， false 不包含
 * @author huajie <banhuajie@163.com>
 */
function check_position($pos = 0, $contain = 0){
    if(empty($pos) || empty($contain)){
        return false;
    }

    //将两个参数进行按位与运算，不为0则表示$contain属于$pos
    $res = $pos & $contain;
    if($res !== 0){
        return true;
    }else{
        return false;
    }
}


/**
 * 检查$act(活动的值)是否包含指定活动
 * @param number $pos 推荐位的值
 * @param number $contain 指定推荐位
 * @return boolean true 包含 ， false 不包含
 * @author huajie <banhuajie@163.com>
 */
function check_activity($act = 0, $contain = 0){
    if(empty($act) || empty($contain)){
        return false;
    }

    //将两个参数进行按位与运算，不为0则表示$contain属于$pos
    $res = $act & $contain;
    if($res !== 0){
        return true;
    }else{
        return false;
    }
}




/**
 * @describe    二维数组排序
 * @author Creatint
 * @param $arr
 * @param $field
 * @param string $order
 * @return mixed
 */
function array_order($arr,$field,$order = 'desc'){
    //排序设置
    if('desc' == $order){
        $order = 'SORT_DESC';
    }elseif ('asc' == $order){
        $order = 'SORT_ASC';
    }
    $arrTmp = array();
    foreach($arr as $id=>$row){
        foreach($row as $k=>$v){
            $arrTmp[$k][$id] = $v;
        }
    }
    if($order){
        array_multisort($arrTmp[$field],constant($order),$arr);
    }
    return $arr;
}



//获取订单状态 前台
function get_order_status($pay_type=1, $pay_status=0, $deliver_type=1, $deliver_status=0, $status=1){
//    echo "pay_type={$pay_type} pay_status={$pay_status} deliver_type={$deliver_type} deliver_status={$deliver_status} status=$status<br>";
    trace("pay_type={$pay_type} pay_status={$pay_status} deliver_type={$deliver_type} deliver_status={$deliver_status} status=$status<br>",'订单参数');

    //未付款
    if(1 == $pay_type  && 0 == $pay_status){
        echo "等待付款 ";
    }

    //待发货
    if( 1 == $deliver_type  &&  0 != $pay_type  && 0 != $pay_status  &&  0 == $deliver_status  &&  1 == $status){
        echo "等待发货 ";
    }
    //待取货
    if($deliver_status == 0 && $deliver_type == 0){
        echo "等待取货 ";
    }

    //待收货
    if( 0 !=$deliver_type  &&  1 == $deliver_status){
        echo "等待收货 ";
    }

    //已收货 交易成功
    if( 2 == $deliver_status  && 2 == $status){
        echo "交易成功 ";
    }


    //申请退款
    if( 3 == $status  &&  0 != $pay_status){
        echo "退款申请中 ";
    }elseif( 4 == $status && 0 != $pay_status){
        echo '已退款';
    }
}

//获取订单状态 后台
function admin_get_order_status($pay_type=1, $pay_status=0, $deliver_type=1, $deliver_status=0, $status=1){

    //未付款/已付款
    if(1 == $pay_type  && 0 == $pay_status){
        echo "<span class=\"label label-danger\">待付款</span>";
    }elseif(1 == $pay_type  &&  0 != $pay_status){
        echo "<span class=\"label label-success\">已付款</span>";
    }

    //待发货
    if( 1 == $deliver_type  &&  0 != $pay_type  && 0 != $pay_status  &&  0 == $deliver_status  &&  1 == $status){
        echo "<span class=\"label label-danger\">待发货</span>";
    }

    // 已发货
    if( 1 == $deliver_type && 0 != $pay_type && 0 != $pay_status && 1 == $deliver_status ){
        echo "<span class=\"label label-warning\">已发货</span>";
    }

    //待取货/待收货
    if( 0 == $deliver_type&& 0 == $deliver_status){
        echo "<span class=\"label label-warning\">待取货</span>";
    }elseif( 0 !=$deliver_type  &&  1 == $deliver_status){
        echo "<span class=\"label label-warning\">待收货</span>";
    }


    //已收货
    if( 0 != $deliver_type  && 2 == $deliver_status){
        echo "<span class=\"label label-success\">已收货</span>";
    }elseif( 1 == $deliver_type && 2 == $deliver_status){
        echo "<span class=\"label label-success\">已取货</span>";
    }

    //取消/交易成功/进行中/申请退款
    if( 0 == $status ) {
        echo "<span class=\"label label-danger\">关闭</span>";
    }elseif( 2 == $status){
        echo "<span class=\"label label-success\">交易完成</span>";
    }elseif (1 == $status){
        echo "<span class=\"label label-warning\">进行中</span>";
    }elseif (3 == $status){
        echo "<span class=\"label label-danger\">申请退款</span>";
    }elseif (4 == $status){
        echo "<span class=\"label label-success\">已退款</span>";
    }
}

//获取订单操作按钮 前台
function get_order_btn($pay_type=1, $pay_status=0, $deliver_type=1, $deliver_status=0, $status=1,$id=null){

    //未付款
    if(0 != $pay_type  &&  0 == $pay_status){
        echo "<a class='cancel order-alert-btn' href='javascript:;' data-tip='".C("TIP_ORDER_CANCEL")."'  data-href='". U('Order/delete',array('order_id'=>$id)) ."'>取消订单</a>";
        echo "<a class='payment' href='/Pay/buy/index.php?order_id={$id}'>付款</a>";
    }

    //已付款，未发货时
    if(  0 != $pay_type  &&  0 != $pay_status  &&  1 == $deliver_type  &&  0 == $deliver_status  &&  1 == $status){
        echo "<a class='cancel order-alert-btn' href='javascript:;' data-tip='".C("TIP_ORDER_TUIKUAN")."'   data-href='" . U('Order/tuikuan',array('order_id'=>$id)) . "' >申请退款</a>";
    }
    //待取货
    if($deliver_status == 0 && $deliver_type == 0){
        return "待取货";
    }

    //待收货,确认收货
    if( 0 !=$deliver_type  &&  1 == $deliver_status){
//        echo "<a class='payment' href='" . U('Order/queren',array('order_id'=>$id)) . "' onclick=\"if (!confirm('". C("TIP_ORDER_QUEREN") ."')) return false;\">确认收货</a>";
        echo "<a class='payment order-alert-btn' href='javascript:;' data-tip='".C("TIP_ORDER_QUEREN")."'  data-href='". U('Order/queren',array('order_id'=>$id)) ."'>确认收货</a>";
    }

    //已收货
    if($deliver_status == 2){
//        echo "已收货";
    }

    // 交易成功 退款成功
    if(2 == $status || 4 == $status){
        echo "<a class='payment order-alert-btn' href='javascript:;' data-tip='".C("TIP_ORDER_DELETE")."'  data-href='". U('Order/delete',array('order_id'=>$id)) ."'>删除订单</a>";
    }



}



//获取订单操作按钮 后台
function admin_get_order_btn($pay_type=1, $pay_status=0, $deliver_type=1, $deliver_status=0, $status=1,$id=null){

    //交易成功
    if( 0 != $pay_status  &&  2 == $deliver_status && 1 == $status){
        echo "<a href='".U('Order/operate',array('id'=>$id,'status'=>2))."'>交易完成</a>";
    }

    //待取货/待收货
    if( 0 == $deliver_type&& 0 == $deliver_status &&  0 != $status){
        echo "<a href='".U('Order/operate',array('id'=>$id,'deliver_status'=>2))."'>收货 </a></case>";
    }elseif( 0 !=$deliver_type  &&  0 == $deliver_status && 0 != $pay_status && 1 == $status ){
        echo "<a class='order-alert-btn' href='javascript:;' data-tip='请填写快递公司与快递单号' data-type='wuliu' data-href='". U('Order/deliver',array('id'=>$id)) ."'>发货 </a></case>";
    }elseif(  0 !=$deliver_type  &&  0 == $deliver_status && 0 != $pay_status &&  3 == $status ){
//        echo "<a href='".U('Order/operate',array('id'=>$id,'status'=>4))."' onclick=\"javascript:if(!confirm('确定要修改订单状态为\'已退款\'吗？')) this.preventDefault();\">退款 </a></case>";
        echo "<a class=\"confirm\" href='".U('Order/operate',array('id'=>$id,'status'=>4))."' data-msg=\"确定要修改订单状态为'已退款'吗？\">退款 </a></case>";
    }

    //查看物流
    if(  0 !=$deliver_type  &&  0<$deliver_status){
        echo "<a class='order-wuliu-btn' href='javascript:;' data-href='". U("Order/get_deliver",array('id'=>$id)) ."'>查看物流 </a></case>";
    }

    // 订单 关闭/删除
    if(0 == $status){
        echo "<a class='confirm' data-msg='确定要删除订单吗?' href='".U('Order/delete',array('id'=>$id))."'>删除</a>";
    }elseif( 2 == $status || 4 == $status){
        echo "<a class='confirm' data-msg='确定要关闭订单吗?' href='".U('Order/operate',array('id'=>$id,'status'=>0))."'>关闭</a>";
    }

}


/**
 * 处理插件钩子
 * @param string $hook   钩子名称
 * @param mixed $params 传入参数
 * @return mixed
 */
function hook($hook,$params=array(),$filter=false){
//    echo '钩子开始 ';dump($hook);
    return  \Think\Hook::listen($hook,$params,$filter);
}

/**
 * 获取插件类的类名
 * @param strng $name 插件名
 */
function get_addon_class($name){
    $class = "Addons\\{$name}\\{$name}Addon";
    return $class;
}

/**
 * select返回的数组进行整数映射转换
 *
 * @param array $map  映射关系二维数组  array(
 *                                          '字段名1'=>array(映射关系数组),
 *                                          '字段名2'=>array(映射关系数组),
 *                                           ......
 *                                       )
 * @return array
 *  array(
 *      array('id'=>1,'title'=>'标题','status'=>'1','status_text'=>'正常')
 *      ....
 *  )
 *
 */
function int_to_string(&$data,$map=array('status'=>array(1=>'正常',-1=>'删除',0=>'禁用',2=>'未审核',3=>'草稿'))) {
    if($data === false || $data === null ){
        return $data;
    }
    $data = (array)$data;
    foreach ($data as $key => $row){
        foreach ($map as $col=>$pair){
            if(isset($row[$col]) && isset($pair[$row[$col]])){
                $data[$key][$col.'_text'] = $pair[$row[$col]];
            }
        }
    }
    return $data;
}

/**
 * 随机字符
 * @param number $length 长度
 * @param string $type 类型
 * @param number $convert 转换大小写
 * @return string
 */
function random($length=6, $type='string', $convert=0){

    $config = array(
        'number'=>'1234567890',
        'letter'=>'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'string'=>'abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789',
        'all'=>'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    );

    if(!isset($config[$type])) $type = 'string';
    $string = $config[$type];

    $code = '';
    $strlen = strlen($string) -1;
    for($i = 0; $i < $length; $i++){
        $code .= $string{mt_rand(0, $strlen)};
    }
    if(!empty($convert)){
        $code = ($convert > 0)? strtoupper($code) : strtolower($code);
    }
    return $code;
}



/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
    if(is_array($list)){
        $refer = $resultSet = array();
        foreach ($list as $i => $data)
            $refer[$i] = &$data[$field];
        switch ($sortby) {
            case 'asc': // 正向排序
                asort($refer);
                break;
            case 'desc':// 逆向排序
                arsort($refer);
                break;
            case 'nat': // 自然排序
                natcasesort($refer);
                break;
        }
        foreach ( $refer as $key=> $val)
            $resultSet[] = &$list[$key];
        return $resultSet;
    }
    return false;
}


function get_percentage($min,$max){
    if(0 !== $max){
        return round(($min/$max)*100);
    }else{
        return 0;
    }
}



function get_order_wuliu($order_id){
    $Order = M("Order");
    $wuliu = $Order->where(array('id'=>$order_id))->find();
 
    if(empty($wuliu) || empty($wuliu['wuliu']) || empty($wuliu['wuliu_number'])){
        return false;
    }

    Vendor("alisdkphp.ShowapiRequest");
//    $Wuliu = new \ShowapiRequest("http://ali-deliver.showapi.com/showapi_expressList","774624c4a6f44cf8b3be870cdf0a3d3b");
    $Wuliu = new \ShowapiRequest("http://ali-deliver.showapi.com/showapi_expInfo","774624c4a6f44cf8b3be870cdf0a3d3b");
    $response=$Wuliu->addTextPara("com", $wuliu['wuliu'])
        ->addTextPara("nu", $wuliu['wuliu_number'])
        ->get( );//也可以换成->post()

//    echo ("server return is:\r\n" );
//    echo($response->getContent()."\r\n" ); 				//content包括了头和返回体
//    echo($response->getBody()."\r\n" );					//body是返回体
    $result = json_decode($response->getBody()); //做json转换
//    echo ("showapi_res_code  is:\r\n");
//    echo($result->showapi_res_code."\r\n" );
    $res = $result->showapi_res_body;
    if( 0 == $res->showapi_res_code || empty($res)){
        $data['mailNo'] = $res->mailNo;
        $data['update'] = $res->update;
        $data['updateStr'] = $res->updateStr;
        $data['ret_code'] = $res->ret_code;
        $data['flag'] = $res->flag;
        $data['status'] = $res->status;
        $data['tel'] = $res->tel;
        $data['expSpellName'] = $res->expSpellName;
        $data['data'] = $res->data;
        return $data;
    }else{
        return false;
    }


}

function get_order_wuliu_com($com_name=''){
    Vendor("alisdkphp.ShowapiRequest");
//    $Wuliu = new \ShowapiRequest("http://ali-deliver.showapi.com/showapi_expressList","774624c4a6f44cf8b3be870cdf0a3d3b");
    $Wuliu = new \ShowapiRequest("http://ali-deliver.showapi.com/showapi_expressList","774624c4a6f44cf8b3be870cdf0a3d3b");
    $response=$Wuliu
        ->addTextPara("expName", $com_name)
        ->get( );//也可以换成->post()

//    echo ("server return is:\r\n" );
//    echo($response->getContent()."\r\n" ); 				//content包括了头和返回体
//    echo($response->getBody()."\r\n" );					//body是返回体
    $result = json_decode($response->getBody()); //做json转换
//    echo ("showapi_res_code  is:\r\n");
//    echo($result->showapi_res_code."\r\n" );
//    dump($result);
    $res = $result->showapi_res_body;
//    dump($res);
    if( 0 == $res->showapi_res_code || empty($res)){
        $data['ret_code'] = $res->ret_code;
        $data['flag'] = $res->flag;
        $data['data'] = $res->expressList;
        return $data;
    }else{
        return false;
    }


}


function get_total_price($carts){
    $total = 0;
    foreach($carts as $v){
        $total += $v['price']*$v['number'];
    }
    return $total;
}


function arr2str($arr, $split=','){
    if(empty($arr)){
        return '';
    }
    if(!is_array($arr)){
        return $arr;
    }
    $str = '';
    foreach ($arr as $v){
        $str = "{$v}{$split}";
    }
    $str = trim($str,$split);
    return $str;
}



//将 xml数据转换为数组格式。
function xml_to_array($xml){
    $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
    if(preg_match_all($reg, $xml, $matches)){
        $count = count($matches[0]);
        for($i = 0; $i < $count; $i++){
            $subxml= $matches[2][$i];
            $key = $matches[1][$i];
            if(preg_match( $reg, $subxml )){
                $arr[$key] = xml_to_array( $subxml );
            }else{
                $arr[$key] = $subxml;
            }
        }
    }
    return $arr;
}


function close_cache($close){
    if($close){
        return "";
    }else{
        return rand();
    }
}